home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / games.arc / LEM.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1983-12-22  |  7.4 KB  |  301 lines

  1. 10  ' *****************
  2. 20  ' **     LEM     **
  3. 30  ' *****************
  4. 40  '
  5. 50  SCREEN 1
  6. 60  CLS
  7. 70  KEY OFF
  8. 80  LOCATE 2,7
  9. 90  PRINT "* * *  OUT ON A LEM  * * *
  10. 100  LOCATE 5,1
  11. 110  PRINT "A challenging game of skill ...
  12. 120  LOCATE 7,1
  13. 130  PRINT "Use the special function keys F1
  14. 140  PRINT "through F3 to run your left, right,
  15. 150  PRINT "and vertical thrusters.  You are to
  16. 160  PRINT "land the lunar excursion module (LEM)
  17. 170  PRINT "as gently and accurately as possible.
  18. 180  PRINT
  19. 190  PRINT "Turn a given thruster off by pressing
  20. 200  PRINT "the same key a second time.
  21. 210  PRINT
  22. 220  PRINT "Watch your fuel supply!
  23. 230  PRINT
  24. 240  PRINT "If you have fuel left, the onboard
  25. 250  PRINT "computer will -attempt- to return
  26. 260  PRINT "you to earth ...
  27. 270  '
  28. 280  LOCATE 25,9
  29. 290  PRINT "Press any key to begin";
  30. 300  '
  31. 310  ' Starting point for each landing attempt
  32. 320  IF LEN(INKEY$) THEN 320
  33. 330  K$ = INKEY$
  34. 340  IF K$ = "" THEN 330
  35. 350  '
  36. 360  COLOR 0,1
  37. 370  CLS
  38. 380  '
  39. 390  ' Activate engine keys
  40. 400  ON KEY(1) GOSUB 1990
  41. 410  ON KEY(2) GOSUB 2030
  42. 420  ON KEY(3) GOSUB 2070
  43. 430  KEY (1) ON
  44. 440  KEY (2) ON
  45. 450  KEY (3) ON
  46. 460  '
  47. 470  ' A different game each second of the hour
  48. 480  T$ = MID$(TIME$,4,2) + MID$(TIME$,7)
  49. 490  RANDOMIZE VAL(T$)
  50. 500  '
  51. 510  ' Build the space ship image
  52. 520  LINE (3,1)-(5,5),2,BF
  53. 530  LINE (2,2)-(6,4),2,BF
  54. 540  LINE (1,7)-(2,6),3
  55. 550  LINE (6,6)-(7,7),3
  56. 560  DIM SHIP(7)
  57. 570  GET (0,0)-(8,8),SHIP
  58. 580  '
  59. 590  ' Build vertical exhaust image
  60. 600  LINE (9,1)-(11,1)
  61. 610  DIM EXHAUSTX(1)
  62. 620  GET (9,1)-(11,1),EXHAUSTX
  63. 630  '
  64. 640  ' Build horizontal exhaust image
  65. 650  LINE (1,9)-(1,12)
  66. 660  DIM EXHAUSTY(1)
  67. 670  GET (1,9)-(1,12),EXHAUSTY
  68. 680  '
  69. 690  ' Sprinkle a few stars around
  70. 700  CLS
  71. 710  FOR I = 1 TO 300
  72. 720  PSET (320*RND,200*RND)
  73. 730  NEXT I
  74. 740  '
  75. 750  ' Draw the earth
  76. 760  CIRCLE (277,63),25,1
  77. 770  PAINT (277,63),1
  78. 780  DRAW "c3bm272,42r7d1r4l13d1l4r22d1l24g1r23l3d1l20"
  79. 790  DRAW "r3d1r14l4d1l8c2l3u1l1d2r18e3l1g1l2f1l5d2r4"
  80. 800  DRAW "l16d1r14d1l15d1r14g1l13d1r13g1l13"
  81. 810  DRAW "d1r13f2l1h3l3g1l8d1r6g1l4f1r3f1l3f1r6u2l1d1l1"
  82. 820  DRAW "d2l3r5d1r1g1r13l2u1l7e1r3d3r7l15f1r15f1l16"
  83. 830  DRAW "g1r21d1l21f1r20g1l18f1r17g1l15"
  84. 840  DRAW "f1r13d1l13d1r11d1l11d1r9g1l7g1r6g1l4d1r2l5"
  85. 850  DRAW "bm273,54c1u1e1r1f2"
  86. 860  DRAW "c3bd2l2bl2bu1l2h1l1bd4l3h1l3h1l2h1l1"
  87. 870  DRAW "bg5r1f2r1f1r5u1l3"
  88. 880  DRAW "bm273,79r1f1d1l3h1l1h2u2e3r2e1r9l3h1l4"
  89. 890  DRAW "bh2e1r4e1r7l3e2r1"
  90. 900  '
  91. 910  ' Choose site for landing pad
  92. 920  XL = 140 + 50 * RND
  93. 930  YL = 180 - 10 * RND
  94. 940  '
  95. 950  ' Create topographical features of moon
  96. 960  M1 = M2
  97. 970  M2 = M1 + 37 * RND
  98. 980  IF M2 > 319 THEN M2 = 319
  99. 990  H1 = H2
  100. 1000  H2 = 190 - 70 * RND
  101. 1010  IF H1 = 0 THEN 990
  102. 1020  IF M2 < XL - 39 THEN 1050
  103. 1030  IF M2 > XL + 39 THEN 1050
  104. 1040  H2 = YL
  105. 1050  LINE (M1,H1)-(M2,H2),1
  106. 1060  IF M2 < 319 THEN 960
  107. 1070  PAINT (0,199),1
  108. 1080  '
  109. 1090  ' Draw the landing pad
  110. 1100  LINE (XL-3,YL)-(XL+3,YL+2),,BF
  111. 1110  '
  112. 1120  ' Slightly random starting location for ship
  113. 1130  SHIPX = 50 * RND
  114. 1140  SHIPY = 20 * RND
  115. 1150  '
  116. 1160  ' Slightly random starting velocity for ship
  117. 1170  VELX = 7 + RND * 3
  118. 1180  VELY = 1 + RND
  119. 1190  '
  120. 1200  ' Starting conditions
  121. 1210  PUT (SHIPX,SHIPY),SHIP,XOR
  122. 1220  FACTOR = 0.1
  123. 1230  FUEL = 999
  124. 1240  THRUSTUP = 3 : GOSUB 3000
  125. 1250  '
  126. 1260  ' Main flight loop starts here
  127. 1270  PULSE = PULSE MOD 7 + 1
  128. 1280  IF PULSE = 1 THEN SOUND 1200-FUEL/5,1
  129. 1290  IF THRUSTUP < 0 THEN FUEL = FUEL - 9.7
  130. 1300  IF THRUSTSIDE THEN FUEL = FUEL - 5.3
  131. 1310  IF FUEL < 0 THEN FUEL = 0
  132. 1320  IF FUEL > 99 THEN 1460
  133. 1330  SOUND 99,0
  134. 1340  IF FUEL > 0 THEN SOUND 400,1
  135. 1350  IF FUEL > 0 THEN 1460
  136. 1360  '
  137. 1370  ' No more fuel left, disengage engines
  138. 1380  SOUND 2000,1
  139. 1390  KEY (1) OFF
  140. 1400  KEY (2) OFF
  141. 1410  KEY (3) OFF
  142. 1420  THRUSTUP = 3
  143. 1430  THRUSTSIDE = 0
  144. 1440  '
  145. 1450  ' Compute new velocities and positions
  146. 1460  VELX = VELX + FACTOR * THRUSTSIDE * 3
  147. 1470  OLDX = SHIPX
  148. 1480  SHIPX = SHIPX + FACTOR * VELX * 3
  149. 1490  VELY = VELY + FACTOR * THRUSTUP
  150. 1500  OLDY = SHIPY
  151. 1510  SHIPY = SHIPY + FACTOR * VELY
  152. 1520  '
  153. 1530  ' Put exhaust images in view if necessary
  154. 1540  IF THRUSTSIDE < 0 THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 1
  155. 1550  IF THRUSTSIDE > 0 THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 1
  156. 1560  IF THRUSTUP < 0 THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 1
  157. 1570  '
  158. 1580  ' Have we drifted off screen?
  159. 1590  IF SHIPY < 0 THEN 1910
  160. 1600  IF SHIPX < 2 THEN 1910
  161. 1610  IF SHIPX > 308 THEN 1910
  162. 1620  '
  163. 1630  ' Erase old ship image via XOR to preserve background
  164. 1640  PUT (OLDX,OLDY),SHIP,XOR
  165. 1650  '
  166. 1660  ' Draw new ship image, XOR onto background
  167. 1670  PUT (SHIPX,SHIPY),SHIP,XOR
  168. 1680  '
  169. 1690  ' Erase the exhaust images if necessary
  170. 1700  IF FLGL THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 0
  171. 1710  IF FLGR THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 0
  172. 1720  IF FLGU THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 0
  173. 1730  '
  174. 1740  ' Skip landing check for awhile if returning to earth
  175. 1750  IF LAND <= 0 THEN 1800
  176. 1760  LAND = LAND - 0.07
  177. 1770  GOTO 1840
  178. 1780  '
  179. 1790  ' Are landing pads touching the moon (and not the earth)?
  180. 1800  IF POINT (SHIPX,SHIPY+8) = 1  AND SHIPY > 85 THEN 2110
  181. 1810  IF POINT (SHIPX+8,SHIPY+8) = 1 AND SHIPY > 85 THEN 2110
  182. 1820  '
  183. 1830  ' Update the fuel supply
  184. 1840  LOCATE 25,16
  185. 1850  PRINT USING "FUEL ###";FUEL;
  186. 1860  '
  187. 1870  ' Keep on flying
  188. 1880  GOTO 1270
  189. 1890  '
  190. 1900  ' We just drifted off screen
  191. 1910  CLS
  192. 1920  LOCATE 12,4
  193. 1930  IF LAND = 0 THEN PRINT "MISSION ABORTED, RETURN TO EARTH"
  194. 1940  IF LAND <> 0 THEN PRINT "       WELCOME HOME HERO!       "
  195. 1950  IF LAND <> 0 THEN PLAY "L4 DEEEDEF L1 E"
  196. 1960  RUN 320
  197. 1970  '
  198. 1980  ' Subroutine F1 ... left engine control
  199. 1990  THRUSTSIDE = -(THRUSTSIDE <> 1)
  200. 2000  RETURN
  201. 2010  '
  202. 2020  ' Subroutine F2 ... right engine control
  203. 2030  THRUSTSIDE = (THRUSTSIDE <> -1)
  204. 2040  RETURN
  205. 2050  '
  206. 2060  ' Subroutine F3 ... vertical engine control
  207. 2070  THRUSTUP = 7 * (THRUSTUP = 3) - 3 * (THRUSTUP = -7)
  208. 2080  RETURN
  209. 2090  '
  210. 2100  ' We landed! But how did we fare?
  211. 2110  LOCATE 1,1
  212. 2120  VEL = ABS(VELX) + ABS(VELY)
  213. 2130  IF VEL < 4 THEN 2350
  214. 2140  '
  215. 2150  ' Disintegrating ship, parts streaking out from crater
  216. 2160  PRESET (SHIPX+4,SHIPY+8)
  217. 2170  FOR I = 1 TO VEL * 0.7
  218. 2180  DELX = 9 * VEL * (RND-0.5)
  219. 2190  DELY = 7 * VEL * (-RND)
  220. 2200  DRAW "C2 NM+=DELX;,=DELY;"
  221. 2210  NEXT I
  222. 2220  '
  223. 2230  ' Fast enough to dig new crater?
  224. 2240  IF VEL < 8 THEN 2300
  225. 2250  PRT$ = "New crater is #### meters wide ...          "
  226. 2260  PRINT USING PRT$ ; VEL * VEL / 7
  227. 2270  GOTO 2780
  228. 2280  '
  229. 2290  ' Landing was too rough, sorry
  230. 2300  PRINT "Damaged beyond repair ...              "
  231. 2310  PRINT "Enjoy your stay !          ";
  232. 2320  GOTO 2780
  233. 2330  '
  234. 2340  ' Landed ok, just how well did you do?
  235. 2350  IF VEL < 3 THEN 2390
  236. 2360  PRINT "Fairly soft landing              "
  237. 2370  GOTO 2570
  238. 2380  '
  239. 2390  IF VEL < 2 THEN 2430
  240. 2400  PRINT "Nice job! ";
  241. 2410  GOTO 2570
  242. 2420  '
  243. 2430  IF VEL < 1 THEN 2470
  244. 2440  PRINT "Excellent soft landing!";
  245. 2450  GOTO 2570
  246. 2460  '
  247. 2470  IF SHIPX-XL+4 < 3 THEN 2510
  248. 2480  PRINT "Superior landing job!";
  249. 2490  GOTO 2570
  250. 2500  '
  251. 2510  PRINT "The President calls with his";
  252. 2520  LOCATE 2,1
  253. 2530  PRINT "congratulations on a superb landing!";
  254. 2540  GOTO 2740
  255. 2550  '
  256. 2560  ' Ok, so how close to the landing pad are you?
  257. 2570  DIS = ABS(SHIPX-XL+4) + ABS(SHIPY-YL+8)
  258. 2580  LOCATE 2,1
  259. 2590  IF DIS < 50 THEN 2630
  260. 2600  PRINT "But you're way out in the boonies!";
  261. 2610  GOTO 2740
  262. 2620  '
  263. 2630  IF DIS < 10 THEN 2670
  264. 2640  PRINT "But you missed the landing site!";
  265. 2650  GOTO 2740
  266. 2660  '
  267. 2670  IF DIS < 3 THEN 2710
  268. 2680  PRINT USING "But you missed the spot by ## meters.";DIS
  269. 2690  GOTO 2740
  270. 2700  '
  271. 2710  PRINT "And you landed right on target!";
  272. 2720  '
  273. 2730  ' Music for good landings ...
  274. 2740  PLAY "o4t128mll6cmsc#e-.mlc mse-c#c.mlcmsffl1f"
  275. 2750  GOTO 2810
  276. 2760  '
  277. 2770  ' Music for disastrous landings ...
  278. 2780  PLAY "mst64l6n3n7n3n7l3n2"
  279. 2790  '
  280. 2800  ' Shall we try a return to earth?
  281. 2810  IF (FUEL <> 0) AND (VEL < 4 ) THEN 2820 ELSE RUN 320
  282. 2820  LOCATE 1,1
  283. 2830  PRINT "Earth calling - return home                   ";
  284. 2840  LOCATE 2,1
  285. 2850  PRINT "                                              ";
  286. 2860  VELX = 0
  287. 2870  VELY = -1
  288. 2880  LAND = 1
  289. 2890  THRUSTUP = -7
  290. 2900  THRUSTSIDE = 0
  291. 2910  FOR Z = 1 TO 2000
  292. 2920  NEXT Z
  293. 2930  LOCATE 1,1
  294. 2940  PRINT "LEM computer engaged - returning home         ";
  295. 2950  KEY (1) OFF
  296. 2960  KEY (2) OFF
  297. 2970  KEY (3) OFF
  298. 2980  IF LEN(INKEY$) THEN 2980
  299. 2990  GOTO 1270
  300. 3000  IF FUEL > 999 THEN FUEL = 999 : RETURN
  301.